
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package szachy;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.Serializable;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Popup;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;

/**
 *
 * @author Robert
 */
public class Klient extends JFrame implements ActionListener, Serializable {

    private static final long serialVersionUID = 1L;

    public Klient() throws RemoteException {
        init();
    }
    /*
     * Metoda inicjująca nasze okno gracza
     */

    public final void init() throws RemoteException {
        plansza = G.ZwrocPlansze();
        pozycja = new int[8][8];
        pozycjaFigury = new int[2];
        pozycjaDocelowa = new int[2];
        pozycjaFigury[0] = -1;
        pozycjaFigury[1] = -1;
        pozycjaDocelowa[0] = -1;
        pozycjaDocelowa[1] = -1;
        //ustawienia okna
        setTitle("Szachy");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //reakcja na zamkniécie
        setSize(700, 600);
        setLocation(150, 75);
        setResizable(false); // brak rozciagliwosci
        //podzielenie okna 3 części
        okno = new JPanel();
        centralnyPanel = new JPanel();
        gornyPanel = new JPanel();
        lewyPanel = new JPanel();
        okno.setLayout(new BorderLayout());
        okno.add(gornyPanel, BorderLayout.NORTH);
        okno.add(lewyPanel, BorderLayout.WEST);
        okno.add(centralnyPanel, BorderLayout.CENTER);
        add(okno);
        centralnyPanel.setLayout(new GridLayout(8, 8, 0, 0)); //plansz gry 8x8
        gornyPanel.setLayout(new FlowLayout()); //grony pasek z literami
        lewyPanel.setLayout(new GridLayout(8, 1, 0, 0)); //lewy pasek z cyframi
        for (int i = 1; i < 9; i++) {
            //dodanie znakow u gory
            text = new JLabel();
            text.setText("            " + (char) (64 + i) + "            ");
            gornyPanel.add(text);
            //dodanie cyfr po lewej
            text = new JLabel();
            text.setText("" + (i));
            lewyPanel.add(text);
        }
        int nr = 0;
        //dodanie przycisków na planszy
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                pozycja[i][j] = nr;
                przycisk = new JButton("");
                przycisk.setSize(20, 30);
                przycisk.addActionListener(this);
                centralnyPanel.add(przycisk);
                nr++;
            }
        }
    }
    /*
     * Funckja obsługująca aklcję przycisku
     */
     public void windowActivated(Event e) throws RemoteException{
         RysujPlansze();
     }
    public void Czekaj() throws RemoteException {
        centralnyPanel.removeMouseListener(null);
            while (G.CzyjRuch() != gracz) {
                plansza=G.ZwrocPlansze();
                if(SwingUtilities.isEventDispatchThread()) RysujPlansze();
                okno.updateUI();
                RysujPlansze();
                okno.validate();
        centralnyPanel.addMouseListener(null);
            }
    }

    public void Mat() {
        JFrame frame = new JFrame("Show Message Dialog");
        frame.setSize(400, 400);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void actionPerformed(ActionEvent e) {
        try {
            RysujPlansze();
        } catch (RemoteException ex) {
            Logger.getLogger(Klient.class.getName()).log(Level.SEVERE, null, ex);
        }
        JButton wcisnietyPrzycisk = (JButton) e.getSource(); //pobranie wciśniętego przycisku
        int przyciskX = wcisnietyPrzycisk.getX(); //pozycja x przycisku
        int przyciskY = wcisnietyPrzycisk.getY(); //pozycja y przycisku
        Dimension rozmiar = wcisnietyPrzycisk.getSize();
        int przyciskPozY = przyciskX / rozmiar.width; //numer kolumny
        int przyciskPozX = przyciskY / rozmiar.height; //numer wiersza
        int przyciskNr = pozycja[przyciskPozX][przyciskPozY];
        //jeśli gracz naciśnie na puste pole
        if (!plansza[przyciskPozX][przyciskPozY].SprawdzCzyPoleZajete()) {
            if (pozycjaDocelowa[0] != -1) { //usunięcie starego podświetlenia
                przycisk = (JButton) centralnyPanel.getComponent(pozycja[pozycjaDocelowa[0]][pozycjaDocelowa[1]]);
                przycisk.setBorder(null);
            }
            przycisk = (JButton) centralnyPanel.getComponent(przyciskNr);
            obramowanie = BorderFactory.createLineBorder(Color.green, 2);
            przycisk.setBorder(obramowanie);
            pozycjaDocelowa[0] = przyciskPozX;
            pozycjaDocelowa[1] = przyciskPozY;
            if (pozycjaFigury[0] != -1) {
                try {
                    if (G.WykonajRuchu(pozycjaFigury[0], pozycjaFigury[1], pozycjaDocelowa[0], pozycjaDocelowa[1], krol)) {
                        przycisk.setBorder(null);
                        przycisk = (JButton) centralnyPanel.getComponent(pozycja[pozycjaFigury[0]][pozycjaFigury[1]]);
                        przycisk.setBorder(null);
                        pozycjaDocelowa[0] = -1;
                        pozycjaFigury[0] = -1;
                        RysujPlansze();
                        Czekaj();
                    }
                } catch (RemoteException ex) {
                    Logger.getLogger(Klient.class.getName()).log(Level.SEVERE, null, ex);
                }

            }
        } //jeśli gracz naciśnie na swoją figurę
        else if (plansza[przyciskPozX][przyciskPozY].PobierzKolorFigury() == kolorGracza) {
            if (pozycjaFigury[0] != -1) { //usunięcie starego podświetlenia
                przycisk = (JButton) centralnyPanel.getComponent(pozycja[pozycjaFigury[0]][pozycjaFigury[1]]);
                przycisk.setBorder(null);
            }
            przycisk = (JButton) centralnyPanel.getComponent(przyciskNr);
            obramowanie = BorderFactory.createLineBorder(Color.red, 2);
            przycisk.setBorder(obramowanie);
            pozycjaFigury[0] = przyciskPozX;
            pozycjaFigury[1] = przyciskPozY;
            if (pozycjaDocelowa[0] != -1) {
                try {
                    if (G.WykonajRuchu(pozycjaFigury[0], pozycjaFigury[1], pozycjaDocelowa[0], pozycjaDocelowa[1], krol)) {
                        przycisk.setBorder(null);
                        przycisk = (JButton) centralnyPanel.getComponent(pozycja[pozycjaDocelowa[0]][pozycjaDocelowa[1]]);
                        przycisk.setBorder(null);
                        pozycjaDocelowa[0] = -1;
                        pozycjaFigury[0] = -1;
                        RysujPlansze();
                        Czekaj();
                    }
                    //else przycisk.setBorder(null);
                } catch (RemoteException ex) {
                    Logger.getLogger(Klient.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } //jeśli gracz naciśnie na figurę przeciwnika
        else {
            if (pozycjaDocelowa[0] != -1) { //usunięcie starego podświetlenia
                przycisk = (JButton) centralnyPanel.getComponent(pozycja[pozycjaDocelowa[0]][pozycjaDocelowa[1]]);
                przycisk.setBorder(null);
            }
            przycisk = (JButton) centralnyPanel.getComponent(przyciskNr);
            obramowanie = BorderFactory.createLineBorder(Color.green, 2);
            przycisk.setBorder(obramowanie);
            pozycjaDocelowa[0] = przyciskPozX;
            pozycjaDocelowa[1] = przyciskPozY;
            if (pozycjaFigury[0] != -1) {
                try {
                    if (G.WykonajRuchu(pozycjaFigury[0], pozycjaFigury[1], pozycjaDocelowa[0], pozycjaDocelowa[1], krol)) {
                        przycisk.setBorder(null);
                        przycisk.setBorder(null);
                        przycisk = (JButton) centralnyPanel.getComponent(pozycja[pozycjaFigury[0]][pozycjaFigury[1]]);
                        przycisk.setBorder(null);
                        pozycjaDocelowa[0] = -1;
                        pozycjaFigury[0] = -1;
                        RysujPlansze();
                        Czekaj();
                    }
                } catch (RemoteException ex) {
                    Logger.getLogger(Klient.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        try {
            RysujPlansze();
            if (G.SprawdzMat()) {
                Mat();
            }
        } catch (RemoteException ex) {
            Logger.getLogger(Klient.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
    /*
     * Rysowanie planszy na ekran gracza
     */

    public void RysujPlansze() throws RemoteException {
        plansza = G.ZwrocPlansze();
        //wyświetlenie kolorów na przyciskach
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                przycisk = (JButton) centralnyPanel.getComponent(pozycja[i][j]);
                przycisk.setIcon(null);
                if (G.ZwrocKolor(i, j) == 'j') {
                    przycisk.setBackground(new Color(215, 212, 129, 255));
                } else {
                    przycisk.setBackground(new Color(108, 56, 14, 255));
                }
                if (plansza[i][j].SprawdzCzyPoleZajete()) {
                    guzik = (JButton) centralnyPanel.getComponent(pozycja[i][j]);
                    guzik.setIcon(new ImageIcon("figury\\" + plansza[i][j].PobierzFigure().PobierzNazwe() + ".png"));
                }
            }
        }
    }
    //main

    public static void main(String[] args) throws Exception {
        Object o = Naming.lookup("Szachy");
        G = (IGra) o;
        if (G.PrzydzielNumer()) {
            kolorGracza = 'j';
            gracz = true;
            krol = (Krol) G.ZwrocFigure(7, 4);

        } else {
            kolorGracza = 'c';
            gracz = false;
            krol = (Krol) G.ZwrocFigure(0, 4);
        }
        SwingUtilities.invokeLater(new Runnable() {

            Klient K = new Klient();

            public void run() {
                    K.setVisible(true); //widoczność okna
                    try {
                        K.RysujPlansze();
                        K.Czekaj();
                    } catch (RemoteException ex) {
                        Logger.getLogger(Klient.class.getName()).log(Level.SEVERE, null, ex);
                    }
                try {
                    K.RysujPlansze();
                    K.Czekaj();
                } catch (RemoteException ex) {
                    Logger.getLogger(Klient.class.getName()).log(Level.SEVERE, null, ex);
                }
                    
            }
        });

    }
    JPanel centralnyPanel;
    JPanel okno;
    JPanel gornyPanel;
    JPanel lewyPanel;
    JButton przycisk;
    JButton guzik;
    private JLabel text;
    Pole plansza[][];
    static IGra G;
    int pozycja[][];
    int pozycjaFigury[];
    int pozycjaDocelowa[];
    static char kolorGracza;
    Border obramowanie;
    static Krol krol;
    boolean szach;
    static boolean gracz;
}
